import "zone.js/dist/zone-node";
import "reflect-metadata";
import { enableProdMode } from "@angular/core";

// Express Engine
import { ngExpressEngine } from "@nguniversal/express-engine";
// Import module map for lazy loading
import { provideModuleMap } from "@nguniversal/module-map-ngfactory-loader";

import * as express from "express";
import { join } from "path";

// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();

// Express server
const app = express();

const PORT = Number(process.env.PORT) || 4200;
const DIST_FOLDER = join(process.cwd(), "dist");

// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require("./server/main");

// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine(
  "html",
  ngExpressEngine({
    bootstrap: AppServerModuleNgFactory,
    providers: [
      provideModuleMap(LAZY_MODULE_MAP)
      // In case you want to use an AppShell with SSR and Lazy loading
      // you'd need to uncomment the below. (see: https://github.com/angular/angular-cli/issues/9202)
      // {
      //   provide: NgModuleFactoryLoader,
      //   useClass: ModuleMapNgFactoryLoader,
      //   deps: [
      //     Compiler,
      //     MODULE_MAP
      //   ],
      // },
    ]
  })
);

app.set("view engine", "html");
app.set("views", join(DIST_FOLDER, "browser"));

// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });

// Server static files from /browser
app.get(
  "*.*",
  express.static(join(DIST_FOLDER, "browser"), {
    maxAge: "1y"
  })
);

// All regular routes use the Universal engine
app.get("*", (req, res) => {
  res.render("index", {
    req: req,
    res: res,
    // for ngx-cookie
    providers: [
      {
        provide: "REQUEST",
        useValue: req
      },
      {
        provide: "RESPONSE",
        useValue: res
      }
    ]
  });
});

// Start up the Node server
app.listen(PORT, "0.0.0.0", () => {
  console.log(`Node Express server listening on http://localhost:${PORT}`);
});
